package com.tangruojie.optional;

import com.tangruojie.entity.Author;
import com.tangruojie.stream.StreamDemoTest;

import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

/**
 * 安全的获取值
 * 方法	                    说明
 * orElse(value)	        如果为空，返回默认值
 * orElseGet(Supplier)	    延迟计算默认值（更高效）
 * orElseThrow(Supplier)	如果为空就抛出异常
 */
public class OptionalDemo03 {

    public static void main(String[] args) {

        /**
         * Optional.of() 和 orElseGet() 的区别：
         * Optional.of()：用于确保你包装的值不是 null，如果是 null，会抛出异常。
         * orElseGet()：用于在 Optional 中没有值时提供一个默认值。对于已经用 Optional.of() 包装的值，orElseGet() 会在 Optional 为 empty 时提供一个空值（如：空列表）。
         * ---
         * Optional.of() ：确保传入的对象是非空的。
         * orElseGet() ：在 Optional 为空时提供默认值。
         */

        List<Author> authors = StreamDemoTest.getAuthors();

        Optional<List<Author>> optionalAuthors = Optional.of(authors);

        List<Author> authorList = optionalAuthors.orElseGet(new Supplier<List<Author>>() {
            @Override
            public List<Author> get() {
                return List.of();
            }
        });
        for (Author author : authorList) {
            Optional<Author> optionalAuthor = Optional.ofNullable(author);
            Author authorGet = optionalAuthor.orElseGet(Author::new);
            System.out.println(authorGet.getName());
        }

        try {
            List<Author> orElseThrow = optionalAuthors.orElseThrow(new Supplier<Throwable>() {
                @Override
                public Throwable get() {
                    return new RuntimeException("作者列表为空");
                }
            });
            for (Author author : orElseThrow) {
                System.out.println(author.getName());
            }
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }

    }

}
/**
 * Optional.of() 用来包装一个非空对象，并且会在传入 null 时抛出 NullPointerException。
 * 如果你确定 authors 绝不会是 null，可以使用 Optional.of()。它的核心作用是：
 * 将传入的值包装成一个 Optional 实例。
 * 如果传入的是 null，会抛出 NullPointerException。
 * ---
 * orElseGet() 用来提供默认值，当 Optional 中没有值（即为空）时返回一个默认值。
 * 这与 orElse() 不同，orElse() 总是立即计算默认值（即使 Optional 中有值），而 orElseGet() 只有在 Optional 中没有值时才会计算默认值。
 */